package meta

import (
	"game/game-db/orm/column"
	"reflect"
)

type MiniEntityMeta struct {
	EntityBaseMeta
	miniStruct interface{}
}

func (t *MiniEntityMeta) NewEntityPtr() reflect.Value {
	rType := reflect.TypeOf(t.miniStruct)
	objPtrValue := reflect.New(rType.Elem())
	return objPtrValue
}

func NewMiniEntityMeta(miniStruct interface{}) *MiniEntityMeta {
	structFields := fieldsOf(miniStruct)

	var entityMeta MiniEntityMeta
	entityMeta.miniStruct = miniStruct
	entityMeta.columnsMap = make(map[string]column.IColumnMeta)
	entityMeta.fieldsMap = make(map[string]column.IColumnMeta)
	entityMeta.columns = make([]column.IColumnMeta, 0, len(structFields))
	for _, structField := range structFields {
		ormTagStr := structField.Tag.Get("orm")
		if ormTagStr == "" {
			continue
		}
		columnMetag := parseTag(ormTagStr)
		imeta := columnMetaOf(structField, columnMetag)

		entityMeta.columnsMap[imeta.ColumnName()] = imeta
		entityMeta.fieldsMap[imeta.FieldName()] = imeta
		entityMeta.columns = append(entityMeta.columns, imeta)
	}
	return &entityMeta
}
